// ----------------------------------------------------------
// This Source Code Form is subject to the terms of the
// Mozilla Public License, v.2.0. If a copy of the MPL
// was not distributed with this file, You can obtain one
// at http://mozilla.org/MPL/2.0/.
// ----------------------------------------------------------
// Codebase: https://github.com/ArKuznetsov/cpdb/
// ----------------------------------------------------------

#Использовать "../../core"

#Область СлужебныйПрограммныйИнтерфейс

// Процедура - устанавливает описание команды
//
// Параметры:
//  Команда    - КомандаПриложения     - объект описание команды
//
Процедура ОписаниеКоманды(Команда) Экспорт

	Команда.Опция("pp params", "", "Файлы JSON содержащие значения параметров,
	                               | могут быть указаны несколько файлов разделенные "";""")
	       .ТСтрока()
	       .ВОкружении("CPDB_PARAMS");

	Команда.Опция("d db sql-db", "", "имя базы для резервного копирования")
	       .ТСтрока()
	       .Обязательный()
	       .ВОкружении("CPDB_SQL_DATABASE");
	
	Команда.Опция("p bak-path", "", "путь к файлу резервной копии")
	       .ТСтрока()
	       .Обязательный()
	       .ВОкружении("CPDB_SQL_BACKUP_PATH");
	
	Команда.Опция("c create-db", Ложь, "создать базу в случае отсутствия")
	       .Флаговый()
	       .ВОкружении("CPDB_SQL_RESTORE_CREATE_DB");
	
	Команда.Опция("o db-owner", "", "имя владельца базы после восстановления")
	       .ТСтрока()
	       .ВОкружении("CPDB_SQL_RESTORE_DB_OWNER");
	
	Команда.Опция("cd compress-db", Ложь, "включить компрессию страниц таблиц и индексов после восстановления")
	       .Флаговый()
	       .ВОкружении("CPDB_SQL_RESTORE_COMPRESS_DB");
	
	Команда.Опция("sd shrink-db", Ложь, "сжать файлы данных после восстановления")
	       .Флаговый()
	       .ВОкружении("CPDB_SQL_RESTORE_SHRINK_DB");
	
	Команда.Опция("sl shrink-log", Ложь, "сжать файлы журнала транзакций после восстановления")
	       .Флаговый()
	       .ВОкружении("CPDB_SQL_RESTORE_SHRINK_LOG");
	
	Команда.Опция("pd db-path", , "путь к каталогу файлов данных базы после восстановления")
	       .ТСтрока()
	       .ВОкружении("CPDB_SQL_RESTORE_DATA_PATH");
	
	Команда.Опция("pl db-logpath", , "путь к каталогу файлов журнала после восстановления")
	       .ТСтрока()
	       .ВОкружении("CPDB_SQL_RESTORE_LOG_PATH");
	
	Команда.Опция("r db-recovery", "SIMPLE", "установить модель восстановления (RECOVERY MODEL),
	                                         |возможные значения ""FULL"", ""SIMPLE"",""BULK_LOGGED""")
	       .ТСтрока()
	       .ВОкружении("CPDB_SQL_RESTORE_RECOVERY_MODEL");
	
	Команда.Опция("cn db-changelfn", Ложь, "изменить логические имена файлов (LFN) базы, в соответствии с именем базы")
	       .Флаговый()
	       .ВОкружении("CPDB_SQL_RESTORE_CHANGE_LFN");
	
	Команда.Опция("ds delsrc", Ложь, "удалить файл резервной копии после восстановления")
	       .Флаговый()
	       .ВОкружении("CPDB_SQL_RESTORE_DELSRC");
	
КонецПроцедуры // ОписаниеКоманды()

// Процедура - запускает выполнение команды устанавливает описание команды
//
// Параметры:
//  Команда    - КомандаПриложения     - объект  описание команды
//
Процедура ВыполнитьКоманду(Знач Команда) Экспорт

	ЧтениеОпций = Новый ЧтениеОпцийКоманды(Команда);

	ВыводОтладочнойИнформации = ЧтениеОпций.ЗначениеОпции("verbose");

	ПараметрыСистемы.УстановитьРежимОтладки(ВыводОтладочнойИнформации);

	ПараметрыПодключения = Новый Структура("Сервер, Пользователь, ПарольПользователя");
	ПараметрыПодключения.Сервер               = ЧтениеОпций.ЗначениеОпции("srvr", Истина);
	ПараметрыПодключения.Пользователь         = ЧтениеОпций.ЗначениеОпции("user", Истина);
	ПараметрыПодключения.ПарольПользователя   = ЧтениеОпций.ЗначениеОпции("pwd", Истина);

	База                 = ЧтениеОпций.ЗначениеОпции("db");
	ПутьКРезервнойКопии  = ЧтениеОпций.ЗначениеОпции("bak-path");
	СоздаватьБазу        = ЧтениеОпций.ЗначениеОпции("create-db");
	ВладелецБазы         = ЧтениеОпций.ЗначениеОпции("db-owner");
	ВключитьКомпрессию   = ЧтениеОпций.ЗначениеОпции("compress-db");
	СжатьБазу            = ЧтениеОпций.ЗначениеОпции("shrink-db");
	СжатьФайлЛог         = ЧтениеОпций.ЗначениеОпции("shrink-log");
	ПутьКФайлуДанных     = ЧтениеОпций.ЗначениеОпции("db-path");
	ПутьКФайлуЖурнала    = ЧтениеОпций.ЗначениеОпции("db-logpath");
	МодельВосстановления = ЧтениеОпций.ЗначениеОпции("db-recovery");
	ИзменитьЛИФ          = ЧтениеОпций.ЗначениеОпции("db-changelfn");
	УдалитьИсточник      = ЧтениеОпций.ЗначениеОпции("delsrc");

	ПодключениеКСУБД = Новый ПодключениеMSSQL(ПараметрыПодключения.Сервер,
	                                          ПараметрыПодключения.Пользователь,
	                                          ПараметрыПодключения.ПарольПользователя);
	
	РаботаССУБД = Новый РаботаССУБД(ПодключениеКСУБД);

	РаботаССУБД.ВыполнитьВосстановление(База,
	                                    ПутьКРезервнойКопии,
	                                    ПутьКФайлуДанных,
	                                    ПутьКФайлуЖурнала,
	                                    СоздаватьБазу);

	Если УдалитьИсточник Тогда
		УдалитьФайлы(ПутьКРезервнойКопии);
	КонецЕсли;
	
	Если ЗначениеЗаполнено(ВладелецБазы) Тогда
		РаботаССУБД.ИзменитьВладельца(База, ВладелецБазы);
	КонецЕсли;
	
	Если ЗначениеЗаполнено(МодельВосстановления) Тогда
		РаботаССУБД.ИзменитьМодельВосстановления(База, МодельВосстановления);
	КонецЕсли;
	
	Если ИзменитьЛИФ Тогда
		РаботаССУБД.УстановитьЛогическиеИменаФайлов(База);
	КонецЕсли;
	
	Если ВключитьКомпрессию Тогда
		РаботаССУБД.ВключитьКомпрессию(База);
	КонецЕсли;
	
	Если СжатьБазу Тогда
		РаботаССУБД.СжатьБазу(База);
	КонецЕсли;
	
	Если СжатьФайлЛог Тогда
		РаботаССУБД.СжатьФайлЖурналаТранзакций(База);
	КонецЕсли;
	
КонецПроцедуры // ВыполнитьКоманду()

#КонецОбласти // СлужебныйПрограммныйИнтерфейс
